/**
 * 用户模型
 * 对应数据库中的users表
 */
const { DataTypes } = require('sequelize')
const sequelize = require('../config/database')
const bcrypt = require('bcryptjs')
const User = sequelize.define(
	'users',
	{
		id: {
			type: DataTypes.INTEGER,
			primaryKey: true,
			autoIncrement: true,
			comment: '用户ID'
		},
		username: {
			type: DataTypes.STRING(50),
			allowNull: false,
			unique: true,
			comment: '用户名'
		},
		password: {
			type: DataTypes.STRING(100),
			allowNull: true,
			comment: '密码'
		},
		phone: {
			type: DataTypes.STRING(20),
			allowNull: true,
			comment: '手机号'
		},
		openid: {
			type: DataTypes.STRING(100),
			allowNull: true,
			unique: true,
			comment: '微信小程序openid'
		},
		register_time: {
			type: DataTypes.DATE,
			allowNull: false,
			defaultValue: DataTypes.NOW,
			comment: '注册时间'
		},
		role: {
			type: DataTypes.STRING(20),
			allowNull: false,
			defaultValue: 'normal',
			comment: '用户角色，可选值：super(管理员)、normal(普通用户)'
		}
	},
	{
		// 模型选项
		tableName: 'users',
		timestamps: false, // 不使用createdAt和updatedAt字段

		// 模型钩子
		hooks: {
			// 在创建用户之前对密码进行哈希处理
			beforeCreate: async (user) => {
				if (user.password) {
					user.password = await bcrypt.hash(user.password, 10)
				}
			},
			// 在更新用户之前对密码进行哈希处理
			beforeUpdate: async (user) => {
				if (user.changed('password')) {
					user.password = await bcrypt.hash(user.password, 10)
				}
			}
		}
	}
)

// 实例方法：验证密码
User.prototype.validatePassword = async function (password) {
	const decryptPassword = await this.createPassword(password)
	return await bcrypt.compare(password, decryptPassword)
}

User.prototype.createPassword = async function (password) {
	return await bcrypt.hash(password, 10)
}

module.exports = User
